import 'dart:async';

class GlobalTimer {
  static final GlobalTimer _instance = GlobalTimer._internal();
  Timer? _timer;
  int _elapsedSeconds = 0;  // 计时时长 seconds
  final StreamController<int> _streamController =
      StreamController<int>.broadcast();

  DateTime? _startTime;
  DateTime? _pauseTime; // 新增：记录暂停时间点
  bool _isPaused = false; // 新增：表示计时器是否暂停

  int pauseSeconds = 0; // 暂停时的秒数

  factory GlobalTimer() {
    return _instance;
  }

  GlobalTimer._internal();

  void startTimer() {
    if (_timer != null && _timer!.isActive) {
      return;
    }
    _startTime = DateTime.now(); // 记录开始计时的时间戳
    _timer = Timer.periodic(const Duration(seconds: 1), (Timer timer) {
      if (!_isPaused) {
        _elapsedSeconds++;
        _streamController.add(_elapsedSeconds); // 通过Stream通知订阅者
      } else {
      }
    });
  }

  void stopTimer() {
    _timer?.cancel();
    _timer = null;
    _elapsedSeconds = 0; // 重置累计时间
    _startTime = null;
    _pauseTime = null; // 重置暂停时间点
    _isPaused = false; // 重置暂停状态
  }

  void pauseTimer() {
    if (!_isPaused && _timer != null && _timer!.isActive) {
      _isPaused = true;
      _pauseTime = DateTime.now(); // 记录暂停时间点
      pauseSeconds = elapsedSeconds;
      print("--------------暂停计时，当前秒数：$pauseSeconds--------------");
    }
  }

  void resumeTimer() {
    // if (_isPaused && _timer != null && !_timer!.isActive) {
    //   // 如果计时器在暂停后已被取消（如stopTimer被调用），则不恢复
    //   // 这里假设如果_timer为null或不活跃，则不进行恢复操作
    //   // 但在实际应用中，你可能需要更复杂的逻辑来处理这种情况
    //   _isPaused = false;
    //   final DateTime now = DateTime.now();
    //   final Duration pausedDuration = now.difference(_pauseTime!);
    //   _elapsedSeconds += pausedDuration.inSeconds;
    //   _startTime = _startTime!.add(pausedDuration); // 更新开始时间以反映暂停时间
    //   // 注意：这里我们没有重新启动_timer，因为它仍然活跃（只是暂停了逻辑处理）
    //   // 如果_timer被取消，我们需要重新调用startTimer来重启它
    //   // 但在这个简单的例子中，我们假设_timer始终存在且未被取消
    // }
    // 注意：上面的逻辑有一个问题，即_timer在暂停期间仍然会每秒触发一次回调。
    // 为了避免这种情况，我们可以取消并重新启动计时器，但这可能会导致轻微的延迟。
    // 或者，我们可以使用一个更复杂的计时机制，比如使用系统时间而不是Timer.periodic。
    // 下面的代码展示了如何取消并重新启动计时器来避免每秒的回调：
    if (_isPaused && _timer != null) {
      _timer!.cancel();
      _isPaused = false;
      print("--------------恢复计时，暂停时秒数：$pauseSeconds--------------");
      _elapsedSeconds = pauseSeconds;
      startTimer(); // 重新启动计时器
    }
  }

  int get elapsedSeconds => _elapsedSeconds;

  Stream<int> get timerStream => _streamController.stream;

  static String formatDuration(int totalSeconds) {
    int hours = totalSeconds ~/ 3600;
    int minutes = (totalSeconds % 3600) ~/ 60;
    int seconds = totalSeconds % 60;

    String hoursStr = (hours).toString().padLeft(2, '0');
    String minutesStr = (minutes).toString().padLeft(2, '0');
    String secondsStr = (seconds).toString().padLeft(2, '0');

    return "$hoursStr:$minutesStr:$secondsStr";
  }

  void dispose() {
    _streamController.close();
  }
}
